/*
 * @Author: Clark
 * @Email: haixuanwoTxh@gmail.com
 * @Date: 2022-10-14 11:35:50
 * @LastEditors: Clark
 * @LastEditTime: 2022-10-23 17:01:13
 * @Description: file content
 */

#include "common.h"

// #define ENABLE_PERFORMANCE_TEST     // 是否开启性能测试，注释掉则关闭
#define ENABLE_PRINT_DATA           // 是否开启数据打印，注释掉则关闭

/**
 * @brief 以十六进制打印
 * @param data	数据
 * @param dataLen 数据长度
 */
bool print_data_in_hex(const char* info, uint8_t *data, int dataLen)
{
#ifdef ENABLE_PRINT_DATA
#define MAX_SIZE 1024
    if (NULL == data || dataLen <= 0)
        return false;

    if (dataLen > MAX_SIZE)          // 限制打印1024字节
        dataLen = MAX_SIZE;

    char buf[MAX_SIZE*3 + 1] ={0};   // 一个十六进制用两个字节，加一个空格共3字节

    for(int i = 0; i < dataLen; i++)
    {
        snprintf(buf + i*3, 4, "%02x ", data[i]);   // snprintf会在数据后加'\0'，所以存4字节
    }
    printf("%s len[%d]:%s\n", info, dataLen, buf);
#endif
    return true;
}

/**
 * @brief 设置数值到2字节空间
 * @param value 数值
 * @param buf 设置的地址
 */
void set_value_to_2Byte_buf(uint16_t value, uint8_t *buf)
{
	buf[1] = value&0xFF;
	buf[0] = value>>8 & 0xFF;
}

/**
 * @brief 获取2字节空间中的数值
 * @param  buf 获取的地址
 * @param  value 获取的数值
 */
void get_value_from_2Byte_buf(uint8_t *buf, uint16_t *value)
{
	*value  = buf[0]*0x100 + buf[1];
}

#ifdef ENABLE_PERFORMANCE_TEST
// 性能测试起始时间
static time_t performanceTestStartTime = 0;
#endif

/**
 * @brief   重置性能测试
 */
void start_performance_test(void)
{
#ifdef ENABLE_PERFORMANCE_TEST
    struct timeval tv;
    gettimeofday(&tv,0);
    performanceTestStartTime = (tv.tv_sec * 1000000 + tv.tv_usec)/1000;
#endif
}

/**
 * @brief 结束性能测试
 * @param info  测试相关信息
 */
void end_performance_test(const char *info)
{
#ifdef ENABLE_PERFORMANCE_TEST
    struct timeval tv;
    gettimeofday(&tv,0);
    log_debug("JH performance test %s [%ld]ms", info, (tv.tv_sec * 1000000 + tv.tv_usec)/1000 - performanceTestStartTime);
#endif
}
